<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<!--[if lt IE 9]>
  <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<![endif]-->
<title>VIM 中文帮助: 从崩溃中恢复</title>
<link rel="stylesheet" href="vim-stylesheet.css" type="text/css" />
<link rel="canonical" href="https://yianwillis.github.io/vimcdoc/doc/recover.html" />
<script type="text/javascript" src="vimcdoc.js"></script>
<meta name="viewport" content="width=device-width, initial-scale=1" />
</head>
<body>
<nav id=banner>
<form action=tags.html target="tag_iframe">
  <input type="text" name="tag" id="tag" placeholder="标签搜索">
</form>
<iframe name="tag_iframe" src=""></iframe>
<a href="help.html">帮助总览</a> &middot;
<hr/>
<a href="quickref.html">快速参考</a> &middot;
<a href="index.html">命令索引</a> &middot;
<a href="eval.html#functions">函数列表</a> &middot;
<a href="quickref.html#option-list">选项列表</a> &middot;
<hr/>
<a href="usr_toc.html">用户手册</a> &middot;
<a href="help.html#reference_toc">参考手册</a> &middot;
</nav>

<header>
<h2>recover</h2>
</header>
<article id=outer>
<section class=inner>
<b class="vimtag"> <a name="recover.txt">recover.txt</a> </b>   适用于 Vim 9.0 版本。   最近更新: 2020年9月


                  <code class="vim">VIM 参考手册    by Bram Moolenaar</code>
                                <code class="vim">译者</code>: iCrazy&lt;icrazy@ustc.edu&gt;、tocer


从崩溃中恢复                                            <b class="vimtag"> <a name="crash-recovery">crash-recovery</a> </b>

您经历过这样的事情么？您录入一个文档，录入了很长时间，眼看就要完成的时候，灾难
来了: 您的电脑崩溃了！

                        别 担 心 ！

您可以从 Vim 提供的文件里恢复大部分的改动，Vim 用这些文件保存文件的内容。一般
情况下，用单个命令就可以恢复您的文档:
        vim -r filename

1. 交换文件              <a href="recover.html#swap-file">swap-file</a> 
2. 恢复                  <a href="recover.html#recovery">recovery</a> 

</section><hr class="doubleline" /><section class=inner>
<h4>1. 交换文件                                             <b class="vimtag"> <a name="swap-file">swap-file</a> </b></h4>
Vim 把您对文件的改动保存在一个交换文件中。多数情况下，用修改前的原文件加上 Vim
的交换文件，您就可以恢复对文档所做的改动了。

您可以用以下的命令看到当前正在使用的交换文件的文件名:

        :sw[apname]                                     <b class="vimtag"> <a name=":sw">:sw</a> </b> <b class="vimtag"> <a name=":swapname">:swapname</a> </b>

也可使用  <a href="builtin.html#swapname()">swapname()</a>  函数，也可以看到其它缓冲区的交换文件名。

正常情况下，交换文件的文件名和您正在编辑的文件相同，只是扩展名换成了 ".swp"。
- 在 Unix 系统上，交换文件名以 '.' 开始，这样它们就不会在列目录文件时被显示出
  来。
- 在 MS-Windows 系统上，如果 <a href="options.html#'shortname'">'shortname'</a> 选项是打开的，原文件名中的 '.' 会被
  '_' 替代。
- 如果同名交换文件已经存在 (例如: 当您从一个崩溃中恢复时)，Vim 会显示一个<code class="note">警告</code>
  信息，并且会使用另外一个诸如 ".swo"，".swn" ……这样的文件扩展名。
- 现存的文件永远不会因此被 Vim 所覆盖。
- 当 Vim 停止编辑文件的时候，交换文件会被立即删除。

技术上: 用 '_' 替代 '.' 是为了避免在与 MS-DOS 兼容的文件系统中 (crossdos、
        multidos 等) 出现问题。如果 Vim 检测到您所编辑的文件存放在一个与
        MS-DOS 兼容的文件系统上，Vim 会建立一个标志位，实现和 <a href="options.html#'shortname'">'shortname'</a> 选项
        相同的功能。当您开始编辑其他文件时，这个标志位会被重置。
                                                        <b class="vimtag"> <a name="E326">E326</a> </b>
        如果扩展名是 ".swp" 的文件已经存在，逐次递减最后的字母，直到找到没有现
        存文件的名字为止。如果过了 ".saa" 还找不到，不建立交换文件。

通过设置 <a href="options.html#'directory'">'directory'</a> 这个选项，您可以把交换文件放到其他目录中去，而不是默认地
和您所编辑的文件放在同一目录中。
优点:
- 您不会因为 ".swp" 文件的存在弄乱您的目录。
- 当您把选项 <a href="options.html#'directory'">'directory'</a> 的值设置到另一个分区的时候，可以减少 (在一次系统崩溃
  中) 文件所在分区文件系统毁坏的危险。
缺点:
- 如果您在不同目录下面编辑同名文件，您会碰到文件重名问题 (尽管 Vim 会比较文件
  路径而尽力避免此问题的发生)。这会导致 Vim 给出虚假的 ATTENTION <code class="note">警告</code>信息。
- 如果您使用您的宿主 (home) 目录，而别人试图编辑同一个文件的时候，该用户不能访
  问您的交换文件，也就不会出现 ATTENTION <code class="note">警告</code>信息。
在 Amiga 系统上，您还可以使用一种可以恢复数据的 ram disk，但是不能保证它可以
100% 工作正常。把交换文件放在普通的 ram disk (就像 Amiga 系统中的内存那样) 或
者放在重启后所有内容都会被清除的地方 (就像 Unix 上的 /tmp 目录) 是没有意义的，
在一次计算机崩溃中您会丢失所有的交换文件。

如果您希望把交换文件放在一个固定的地方，把类似于下面这些的命令写到您的 .vimrc
文件中去:
        :set dir=dh2:tmp        (针对 Amiga)
        :set dir=~/tmp          (针对 Unix)
        :set dir=c:\\tmp        (针对 Win32)
这对于编辑软盘上的文件是十分便利的。当然您必须先自己建立这个 "tmp" 目录。

对于那些只读的文件，Vim 不会产生交换文件，除非文件特别大，使得内存使用超出了
<a href="options.html#'maxmem'">'maxmem'</a> 或 <a href="options.html#'maxmemtot'">'maxmemtot'</a> 的设置值。当然，如果对只读的文件进行了修改，交换文件文
件还是会被自动建立。

可以复位 <a href="options.html#'swapfile'">'swapfile'</a> 这个选项的值以避免产生交换文件。:noswapfile 修饰符可用来
使新缓冲区不建立交换文件。

:nos[wapfile]   <code class="special">{command}</code>                       <b class="vimtag"> <a name=":nos">:nos</a> </b> <b class="vimtag"> <a name=":noswapfile">:noswapfile</a> </b>
                执行 <code class="special">{command}</code>。如果包含载入新缓冲区的命令，缓冲区载入时不建立
                交换文件，并复位 <a href="options.html#'swapfile'">'swapfile'</a> 选项。如果缓冲区已经有了交换文件则
                不删除之，也不复位 <a href="options.html#'swapfile'">'swapfile'</a>。


<code class="section">检测已经存在的交换文件 </code>

您可以在用户手册中找到这些信息，参阅章节  <a href="usr_11.html#11.3">11.3</a> 。


<code class="section">更新交换文件 </code>

在您录入 200 个字符后或者 4 秒内没有录入任何字符时，交换文件会被更新。只有在缓
冲区被修改的情况下，才会有这样的更新，仅仅移动光标是不会更新交换文件的。为什么
不进行实时的更新？原因在于这样频繁的更新会极大的拖慢其他正常工作的速度。您可以
在 <a href="options.html#'updatecount'">'updatecount'</a> 选项中修改 200 个字符的设置，还可以在 <a href="options.html#'updatetime'">'updatetime'</a> 选项中修改
4 秒的设置 (时间以毫秒为单位给出)。Vim 更新交换文件后，会把文件同步到磁盘上
去。这会消耗一定的时间，在忙碌的 Unix 系统上尤其如此。如果不希望这样，您可以把
<a href="options.html#'swapsync'">'swapsync'</a> 选项置成空串。不过，这样会使文件丢失的几率增大。在一些非 Unix 系统
(MS-Windows、Amiga) 上，交换文件根本不会被写到磁盘上。

如果不希望把修改写到交换文件中，可以通过把 <a href="options.html#'updatecount'">'updatecount'</a> 选项设成 0 来避免这一
点，用 "-n" 选项启动 Vim 时也可以达到相同的效果。而把 <a href="options.html#'updatecount'">'updatecount'</a> 选项设成非
0 值可以恢复对交换文件的写入。这种情况下，所有缓冲区的交换文件都会被建立。但是
当把 <a href="options.html#'updatecount'">'updatecount'</a> 选项设成 0 时，已经存在的交换文件不会被删除，只有设置之后打
开的文件才受到影响。

如果您想确定您对文件所作的修改已经被写到交换文件中了，使用这个命令:

                                        <b class="vimtag"> <a name=":pre">:pre</a> </b> <b class="vimtag"> <a name=":preserve">:preserve</a> </b> <b class="vimtag"> <a name="E313">E313</a> </b> <b class="vimtag"> <a name="E314">E314</a> </b>
:pre[serve]             把当前缓冲区中的所有文本写入交换文件。这样在文件恢
                        复时就不再需要原文件了。本命令设置了当前缓冲区的一个标
                        志位。如果 <a href="options.html#'cpoptions'">'cpoptions'</a> 里有 '&amp;' 标志位而且 Vim 退出时
                        如果此缓冲区还处于载入状态，不删除此缓冲区的交换文件
                         <a href="options.html#cpo-&">cpo-&amp;</a> 。

Vim 会通过文件开始的 6 个字符 "b0VIM " 来识别它的交换文件。Vim 的版本号 (如:
3.0) 会紧跟在那些字符之后。


<code class="section">链接和符号链接 </code>

Unix 上同一文件可以有两个名字。这可以通过硬链接和符号链接 (symlink) 完成。

对于硬链接，Vim 不知道文件另外的名字。所以，交换文件名基于你用来编辑的文件名。
也不会检查是否编辑了使用别的名字的相同文件，因为 Vim 无法找到另外那个交换文件
(除非在你整个硬盘上搜索，这太慢了)。

对于符号链接，Vim 解析链接以找到实际文件的名字。交换文件名基于那个实际的名字。
所以不管你用哪个名字编辑，交换文件名通常总是相同的。但有若干例外:
- 如果实际文件所在的目录不可写，交换文件会放在别处。
- 如果符号链接因为某些原因形成了循环，你会得到 <b class="vimtag"> <a name="E773">E773</a> </b> 错误消息，而使用未经修改
  的文件名。你不能在以后正常地保存文件。

</section><hr class="doubleline" /><section class=inner>
<h4>2. 恢复                                         <b class="vimtag"> <a name="recovery">recovery</a> </b> <b class="vimtag"> <a name="E308">E308</a> </b> <b class="vimtag"> <a name="E311">E311</a> </b></h4>
基本的文件恢复已经在用户手册中解释了:  <a href="usr_11.html#usr_11.txt">usr_11.txt</a> 。

另一种恢复方式是在启动 Vim 后使用 ":recover" 命令。当您用 Vim 编辑一个文件并且
得到一个 "<code class="note">注意</code>: 已找到一个交换文件 ..." 这样的提示时，这样比较方便。这种情况
下，一个简单的 ":recover" 命令就可以完成所有的工作。您也可以在使用 ":recover"
命令时指定文件名或者交换文件名:
                                        <b class="vimtag"> <a name=":rec">:rec</a> </b> <b class="vimtag"> <a name=":recover">:recover</a> </b> <b class="vimtag"> <a name="E305">E305</a> </b> <b class="vimtag"> <a name="E306">E306</a> </b> <b class="vimtag"> <a name="E307">E307</a> </b>
:rec[over] <code class="special">[file]</code>       试图从交换文件中恢复 <code class="special">[file]</code>。如果没有指定 <code class="special">[file]</code>，使用
                        当前缓冲区的文件名。当前缓冲区中的内容会丢失。如果缓冲
                        区已经被修改，此命令失效。

:rec[over]! <code class="special">[file]</code>      类似于 ":recover"，但当前缓冲区中的任何改变都会丢失。

                                                        <b class="vimtag"> <a name="E312">E312</a> </b> <b class="vimtag"> <a name="E309">E309</a> </b> <b class="vimtag"> <a name="E310">E310</a> </b>
在交换文件被损坏时，Vim 仿佛有些智能，知道接下来该怎么做。如果 Vim 对于找到的
文件有所怀疑，它会给出一个出错信息，并且在文本中插入含有 "???" 的行。如果您在
恢复的时候看到了出错信息，请在文件中查找 "???" 并确定到底哪里出了问题。或许您
仍然可以通过剪切和粘贴来取回可用的信息。

最常见的信息是 "???LINES MISSING"。这表示 Vim 无法从原文件中读取文本。通常在系
统崩溃而导致部分原文件无法及时写入磁盘时会出现这样的情况。

在覆盖原文件并删除交换文件之前，请务必确定您所作的恢复是成功的。先把恢复出来的
文件存到别的地方，然后运行 <a href="options.html#'diff'">'diff'</a> 来确定是否已经所需要的改动，是个好习惯。也可
使用  <a href="diff.html#:DiffOrig">:DiffOrig</a> 。

当您确定恢复成功后，请删除交换文件。否则，您会继续得到 ".swp" 文件已经存在的警
告信息。



加 密 和 交 换 文 件                                    <b class="vimtag"> <a name=":recover-crypt">:recover-crypt</a> </b>

如果文本文件经过加密，交换文件也同样要加密。这使得恢复稍微复杂一些。从交换文件
恢复而又用到加密时，你需要输入一到两次加密密钥。

如果文本文件不再存在，只需要输入加密密钥一次来解密交换文件。

如果文本文件存在，其加密方式可能与交换文件不同。你需要输入加密密钥两次:

<code class="section">        Need encryption key for "/tmp/tt" </code>
<code class="section">        Enter encryption key: ****** </code>
<code class="section">        "/tmp/tt" <code class="special">[crypted]</code> 23200L, 522129C </code>
<code class="section">        Using swap file "/tmp/.tt.swp" </code>
<code class="section">        Original file "/tmp/tt" </code>
<code class="section">        Swap file is encrypted: "/tmp/.tt.swp" </code>
<code class="section">        If you entered a new crypt key but did not write the text file, </code>
<code class="section">        enter the new crypt key. </code>
<code class="section">        If you wrote the text file after changing the crypt key press enter </code>
<code class="section">        to use the same key for text file and swap file </code>
<code class="section">        Enter encryption key:  </code>

有两种可能的情况:

1. 加密密钥没有改变，或者在改变后才写入文本文件。你需要输入加密密钥两次。第二
   次，按回车即可。这样就会应用相同的密钥来解密文本文件和交换文件。
2. 输入了新加密密钥，但之后没有保存文本文件。Vim 会使用新密钥来加密交换文件，
   但文本文件仍然会使用旧密钥来加密。第二次提示时要输入新密钥。

<code class="note">注意</code> 恢复后，交换文件的密钥会用于文本文件。写入文本文件时，需要使用新密钥。


 vim:tw=78:ts=8:noet:ft=help:norl:
</section>
</article>
<footer>
Generated by vim2html
</footer>
</body>
</html>
